package com.example.mq.common;

import java.io.*;

/*
* 任何对象都可以用这个进行 序列/反序列化
* (指定对象需要implements Serializable，不用重写方法——Java要求)
* */
public class BinaryTool{

    //对象转字节数组
    public static byte[] toBytes(Object object) throws IOException {

        //流对象的字节数组长度是可变长的，也就是长度不确定
        //所以把object序列化数据逐渐写入到byteArrayOutputStream中
        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();) {
            try (ObjectOutputStream outputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                //writeObject会把该对象进行序列化，生成的二进制数组就会写入到outPutStream中
                //由于outputStream关联到了byteArrayOutputSteam，所以最终会写入到byteArrayOutputSteam
                outputStream.writeObject(object);
            }

            //返回二进制字节数组
            return byteArrayOutputStream.toByteArray();
        }

    }

    //字节数组反序列化为对象
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;

        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {

                //readObject就是从data字节数组读取数据，进行反序列化，返回结果就是Object对象
                object = objectInputStream.readObject();
            }
        }catch (Exception e){
            System.out.println("出现异常fromBytes *********************************************");

        }

        return object;
    }
}
